#ifndef CARD_H
#define CARD_H

#include <QObject>
#include <QMetaEnum>

/* Тип данных кодирующий символ карточки.*/
#define SymbolType QString

// Создам перечиление в Qt-ешной обвязке.
class CardStates : public QObject{
	Q_OBJECT
	Q_ENUMS(CardStatesEnum)
public:
	/** Состояния в которых может находится карточка.*/
	enum CardStatesEnum{
		Closed, //!< Рубашкой вверх
		Opened, //!< Символом вверх
		Deleted //!< Внеигрыы
	};
	/** Получить метаобъект перечисления. @see QMetaEnum */
	static inline const QMetaEnum m(){
		const QMetaObject &mo = CardStates::staticMetaObject;
		return mo.enumerator(mo.indexOfEnumerator("CardStatesEnum"));
	}
};

/** Описывает одну карточку на игровом поле.
 *
 * @author Василий Почкаенко */
class Card : public QObject{
	Q_OBJECT
	/** Символ карточки.*/
	Q_PROPERTY(SymbolType symbol READ symbol NOTIFY symbolChange)
	/** Состояние карточки.*/
	Q_PROPERTY(CardStates::CardStatesEnum state READ state NOTIFY stateChange)
	/** Карточка открыта.*/
	Q_PROPERTY(bool isOpen READ isOpen NOTIFY stateChange)
	/** Карточка закрыта.*/
	Q_PROPERTY(bool isClose READ isClose NOTIFY stateChange)
	/** Карточка удалена.*/
	Q_PROPERTY(bool isDelete READ isDelete NOTIFY stateChange)
public:
	explicit Card(
	    const SymbolType & symbol, //!< Символ карточки.
	    QObject *parent = 0);
	
	/** Символ карточки.*/
	const SymbolType &symbol() const;
	/** Состояние карточки.*/
	CardStates::CardStatesEnum state() const;
	/** Изменить состояние карточки*/
	void setState(CardStates::CardStatesEnum newState);
	/** Карточка открыта.*/
	bool isOpen() const;
	/** Карточка закрыта.*/
	bool isClose() const;
	/** Карточка удалена.*/
	bool isDelete() const;
signals:
	/** Изменилось Символ карточки.*/
	void symbolChange();
	/** Изменилось состояние карточки.*/
	void stateChange();
	
public slots:
private:
	/** Символ карточки.*/
	const SymbolType m_symbol;
	/** Состояние карточки.*/
	CardStates::CardStatesEnum m_state;
};

#endif // CARD_H
